<?php
class Round extends MY_Controller {

	// Modelos usados en las funciones del controlador
	var $modelRoundDAO = 'Round_dao';
	var $modelRoundDTO = 'Round_dto';
	
	var $modelUserDAO = 'User_dao';
	var $modelUserDTO = 'User_dto';
	
	var $modelRoundInputDAO = 'Round_input_dao';

	// Vistas utilizadas en las funciones del controlador
	var $editionView = 'rounds/round_new_view';
	var $gridView = 'rounds/round_all_view';
	var $reportRound = 'reports/round_report';
	var $resultMessageView = '';
	
	// Datos para pasar a las vistas
	var $pageTitle = '';
	
	private $controllerName = 'round';
	
	public function __construct()
    {
    	parent::__construct();
		
		// Éstos modelos los cargo al inicio ya que los utilizo en la mayoría de los métodos
		$this->load->model("$this->modelRoundDAO", 'Round_dao');
		$this->load->model("$this->modelRoundDTO", 'Round_dto');
		
		$this->resultMessageView = $this->template->getResultMessageView();		
	}

	private function _loadUserModels()
	{
		$this->load->model("$this->modelUserDAO", 'User_dao');
		$this->load->model("$this->modelUserDTO", 'User_dto');
	}
		
	public function getAll()
	{	
		if(parent::permitted($this->controllerName, 'getAll')) {
			$this->pageTitle = 'All Rounds';		
			
			// Pueden haberse enviado por post las variables para filtrar las rondas que se desean visualizar
			$endDate = !$this->input->post('endDate') ? '' : $this->input->post('endDate');
			$startDate = !$this->input->post('startDate') ? '' : $this->input->post('startDate');
			
			$condiciones = array();
			if($startDate != '') { // Si se hubiera enviado startDate, lo tomo para el filtro
				$condiciones['startDate >='] = $startDate;
			}
			
			if($endDate != '') { // Si se hubiera enviado endDate, lo tomo para el filtro
				$condiciones['endDate <='] = $endDate;
			}
			
			// Defino los elementos en el arreglo para poder utilizarlas en la vista como variables
			$dataView['endDate'] = $endDate;
			$dataView['startDate'] = $startDate;
			
			// Obtengo la lista de todas las rondas cargadas
			$dataView['rondas'] = $this->Round_dao->obtenerObjetos($condiciones);
			
			// En la vista se debe habilitar o no, el botón de nueva ronda según se trate o no de un usuario administrador
			$dataView['userIsAdmin'] = $this->template->currentUserIsAdmin($_SESSION[$this->template->getRolSessionName()]);
			
			parent::_loadViews($this->gridView, $dataView);
		}
		else { 
			parent::loadForbiddenView();
		}
	}
	
	public function addRound()
	{
		$this->pageTitle = 'New Round';
		$this->_loadEditionForm(0, 'addRound');
	}
	
	public function editRound($idRound)
	{
		$this->pageTitle = 'Edit Round';
		$this->_loadEditionForm($idRound, 'editRound');
	}
	
	private function _loadEditionForm($idRound = 0, $function)
	{	
		if(parent::permitted($this->controllerName, $function)) {
			// Obtengo la ronda que se desea modificar y mostrar en la vista
			$dataView['ronda'] = $this->Round_dao->obtenerObjetoPorID($idRound);
			$dataView['userIsAdmin'] = $this->template->currentUserIsAdmin($_SESSION[$this->template->getRolSessionName()]);

			$dataView['rounds'] = $this->Round_dao->obtenerObjetos(array('id !=' => $idRound));

			$this->load->view($this->editionView, $dataView);
			//parent::_loadViews($this->editionView, $dataView);
		}
		else { 
			parent::loadForbiddenView();
		}
	}
	
	public function saveround()
	{	
		$this->pageTitle = 'Save round';
	
		// Se agregan las validaciones a los campos que corresponde
		$this->form_validation->set_rules('nameRound','Name','trim|required');
        $this->form_validation->set_rules('startDateRound','Start Date','trim|required|callback_validDate');
        $this->form_validation->set_rules('endDateRound','End Date','trim|required|callback_validDate');
		
		$id = is_numeric($this->input->post('id')) ? $this->input->post('id') : 0;
		
		// Obtengo los datos desde el formulario y los asigno al modelo
		if($id == 0) {
			$round = new Round_dto();
			$round->id = 0;
		}
		else $round = $this->Round_dao->obtenerObjetoPorID($id);
		
		$round->name = $this->input->post('nameRound');
		$round->startDate = $this->input->post('startDateRound');
		$round->endDate = $this->input->post('endDateRound');
		$BL_from_round = is_numeric($this->input->post('roundCopy')) ? $this->input->post('roundCopy') : 0;

		$result = $this->Round_dao->guardar($round, $BL_from_round);
		
		// Valido si ocurrió algún error al intentar guardar
		$errores = $result['error_msg'];
		$dataView['result'] = $errores;
		
		if($errores == '') { // Si no hubo error y se guardó la nueva ronda, se debe enviar un mail a todos los usuarios
			redirect('round/getAll');
		}
		else parent::_loadViews("$this->resultMessageView", $dataView);
	}
	
	private function _sendMail($round)
	{
		$errores = '';
		// Cargo los modelos que voy a utilizar
		$this->_loadUserModels();
		
		// Obtengo la lista de mails de todos los usuarios para notificarlos de la nueva ronda
		$mails = $this->User_dao->obtenerMails();
		if($mails != '')
		{
			// Obtengo el mail del usuario actual del sistema
			if($_SESSION[$this->template->getEmailSessionName()]) {
				$mailDesde = $_SESSION[$this->template->getEmailSessionName()];
				$userName = $_SESSION[$this->template->getUsernameSessionName()];
				
				$subject = 'Added new round';
				
				$message = 'Added new round: <b>' . $round->name . '</b>.\n' .
						   'Will open: ' . $round->startDate . '\n' . 
						   'and will close: ' . $round->endDate . '.';
				$message = '<td width="26">&nbsp;</td>
							<td valign="top" style="vertical-align:top;">
								<b>Everyone:</b>
							</td>
							<td>
								<br/>' . $message .
							'</td>';						   
				
				return parent::sendMail($mails, $userName, $mailDesde, $subject, $message);
			}
		}
		
		return $errores;
	}
	
	function validDate($date)
	{
		$this->form_validation->set_message('validDate', 'The field %s must contain a valid date.');
		
		$numerosDate = explode("/", $date);
        if (count($numerosDate) == 3)
        {
            $anio = $numerosDate[0];
            $mes = $numerosDate[1];
            $dia = $numerosDate[2];

            if (is_numeric($anio) && is_numeric($mes) && is_numeric($dia)) 
            {
                return checkdate($mes, $dia, $anio);
            } 
            else { return false; }
        }
        else
        {
            return false;
        }
	}
	
	
	private function _deleteRound($idRound)
	{
		$this->pageTitle = 'Delete round';
		
		$result = $this->Round_dao->borrar($idRound);
			
		// Valido si ocurrió algún error al intentar borrar
		$errores = $result['error_msg'];
		$dataView['result'] = $errores;
		
		if($errores == '') redirect('round/getAll');
		else parent::_loadViews("$this->resultMessageView", $dataView);
	}
	
	
	public function downloadReport($idRound)
	{
		if(parent::permitted($this->controllerName, 'downloadReport')) {
			// Obtengo la ronda de la que se desea generar el informe
			$objRound = $this->Round_dao->obtenerObjetoPorID($idRound);
			$dataView['objRound'] = $objRound;
			
			
			
			// Obtengo las entradas de la ronda, las recorro y las muestro en el informe
			$inputs = $this->Round_dao->getInfoRoundInputs($objRound->id);
			$dataView['inputs'] = $inputs;
			
			$this->load->view($this->reportRound, $dataView);
		}
		else { 
			parent::loadForbiddenView();
		}
	}

	public function valid_range_dates()
	{
		$fecha_desde = $this->input->post('fecha_desde');
		$fecha_desde = str_replace("/", "-", $fecha_desde);
		$fecha_hasta = $this->input->post('fecha_hasta');
		$fecha_hasta = str_replace("/", "-", $fecha_hasta);
		$idRound = $this->input->post('id_round');
		
		if(!$fecha_desde || !$fecha_hasta) echo FALSE;
        else {
			$sentenciaSQL = "SELECT * FROM roundinput
							WHERE idRound = $idRound AND (date < '$fecha_desde'
							 OR date > '$fecha_hasta')";

			$consulta = $this->db->query($sentenciaSQL);
			if ($consulta->num_rows() == 0) {
				 echo TRUE;
			}
			else echo FALSE;
        }
	}
}